﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.IO;
using DO = DataObjects;
using DM = DataMapping;

namespace DataAccess
{
    public class VeiculoDB
    {
        #region Metodos Publicos

        public static DO.Veiculo GetItem(int id)
        {
            using (DM.DataMappingDataContext dc = new DM.DataMappingDataContext())
            {
                DM.Veiculo veiculo = (from v in dc.Veiculos
                                      where v.idVeiculo == id
                                      select v).FirstOrDefault();

                return FillRecord(veiculo);
            }
        }

        public static List<DO.Veiculo> GetList()
        {
            using (DM.DataMappingDataContext dc = new DM.DataMappingDataContext())
            {
                List<DM.Veiculo> veiculoList = (from v in dc.Veiculos
                                                select v).ToList();

                List<DO.Veiculo> veiculoListReturn = new List<DO.Veiculo>();
                foreach (DM.Veiculo c in veiculoList)
                    veiculoListReturn.Add(FillRecord(c));

                return veiculoListReturn;
            }
        }

        public static int Save(DO.Veiculo veiculo)
        {
            using (DM.DataMappingDataContext dc = new DM.DataMappingDataContext())
            {
                DM.Veiculo veiculoDB = (from v in dc.Veiculos
                                        where v.idVeiculo == veiculo.Id
                                        select v).FirstOrDefault();

                if (veiculoDB == null)
                {
                    veiculoDB = new DM.Veiculo();

                    veiculoDB.AnoFab = veiculo.AnoFab;
                    veiculoDB.AnoModelo = veiculo.AnoModelo;
                    veiculoDB.Chassi = veiculo.Chassi;
                    veiculoDB.Cor = veiculo.Cor;
                    veiculoDB.idDespesasVeiculo = veiculo.IdDespVeiculo;
                    veiculoDB.idCompra = veiculo.IdCompra;
                    veiculoDB.idVeiculo = veiculo.Id;
                    veiculoDB.idVenda = veiculo.IdVenda;
                    veiculoDB.marca = veiculo.Marca;
                    veiculoDB.modelo = veiculo.Modelo;
                    veiculoDB.Placa = veiculo.Placa;
                    veiculoDB.Renavan = veiculo.Renavan;
                    veiculoDB.tipoVeiculo = veiculo.TipoVeiculo;

                    dc.Veiculos.InsertOnSubmit(veiculoDB);
                }
                else
                {
                    veiculoDB.AnoFab = veiculo.AnoFab;
                    veiculoDB.AnoModelo = veiculo.AnoModelo;
                    veiculoDB.Chassi = veiculo.Chassi;
                    veiculoDB.Cor = veiculo.Cor;
                    veiculoDB.idDespesasVeiculo = veiculo.IdDespVeiculo;
                    veiculoDB.idCompra = veiculo.IdCompra;
                    veiculoDB.idVeiculo = veiculo.Id;
                    veiculoDB.idVenda = veiculo.IdVenda;
                    veiculoDB.marca = veiculo.Marca;
                    veiculoDB.modelo = veiculo.Modelo;
                    veiculoDB.Placa = veiculo.Placa;
                    veiculoDB.Renavan = veiculo.Renavan;
                    veiculoDB.tipoVeiculo = veiculo.TipoVeiculo;
                }

                try
                {
                    dc.SubmitChanges();
                    return veiculoDB.idVeiculo;
                }
                catch (Exception ex)
                {
                    string date = ((DateTime.Now).ToString()).Substring(0, 9);
                    date = date.Replace('/', '-');
                    string location = "\\\\Servidor\\SharedDocs\\Aplicação\\Log";
                    string path = (String.Format("{0}{1}\\Problema Gravação_{2}.txt", @"", location, date));
                    StreamWriter valor = new StreamWriter(path, true, Encoding.ASCII);
                    valor.WriteLine("Erro ao salvar: " + veiculoDB.idVeiculo);
                    valor.WriteLine(ex.Message);
                    valor.WriteLine("------------------------------------------------------");
                    valor.Close();

                    dc.ChangeConflicts.ResolveAll(RefreshMode.OverwriteCurrentValues);
                    dc.SubmitChanges();

                    return -1;
                }
            }
        }

        public static bool Delete(int id)
        {
            using (DM.DataMappingDataContext dc = new DM.DataMappingDataContext())
            {
                DM.Veiculo veiculoDB = (from v in dc.Veiculos
                                        where v.idVeiculo == id
                                        select v).FirstOrDefault();

                if (veiculoDB != null)
                {
                    try
                    {
                        dc.Veiculos.DeleteOnSubmit(veiculoDB);
                        dc.SubmitChanges();
                        return true;
                    }
                    catch (Exception ex)
                    {
                        string date = ((DateTime.Now).ToString()).Substring(0, 9);
                        date = date.Replace('/', '-');
                        string location = "\\\\Servidor\\SharedDocs\\Aplicação\\Log";
                        string path = (String.Format("{0}{1}\\Problema Exclusão_{2}.txt", @"", location, date));
                        StreamWriter valor = new StreamWriter(path, true, Encoding.ASCII);
                        valor.WriteLine("Erro ao excluir:" + veiculoDB.idVeiculo);
                        valor.WriteLine(ex.Message);
                        valor.WriteLine("------------------------------------------------------");
                        valor.Close();

                        dc.ChangeConflicts.ResolveAll(RefreshMode.OverwriteCurrentValues);
                        dc.SubmitChanges();

                        return true;
                    }
                }
                else
                    return false;
            }
        }

        #endregion

        #region Metodos Privados

        private static DO.Veiculo FillRecord(DM.Veiculo veiculo)
        {
            DO.Veiculo veiculoMapping = new DO.Veiculo();
            veiculoMapping.Id = veiculo.idVeiculo;
            veiculoMapping.TipoVeiculo = veiculo.tipoVeiculo;
            veiculoMapping.Marca = veiculo.marca;
            veiculoMapping.Modelo = veiculo.modelo;
            veiculoMapping.AnoFab = veiculo.AnoFab;
            veiculoMapping.AnoModelo = veiculo.AnoModelo;
            veiculoMapping.Placa = veiculo.Placa;
            veiculoMapping.Renavan = veiculo.Renavan;
            veiculoMapping.Chassi = veiculo.Chassi;
            veiculoMapping.Cor = veiculo.Cor;
            //veiculoMapping.Venda = VendaDB.GetItem(veiculo.idVenda);
            //veiculoMapping.Compra = CompraDB.GetItem(veiculo.idCompra);

            return veiculoMapping;
        }

        #endregion
    }
}
